const INIT_STATE='init';
const CHANGED_STATE='changed';

// 设置Scroll类，critical_point属性代表触发响应事件的scroll值，scrollContainer属性代表含有滚动条的盒模型，eventEl属性代表添加响应事件的元素，默认值为scrollContainer，options属性是一个对象，里面包含了change和reset方法
class Scroll {
    constructor(critical_point,scrollContainer,eventEl=scrollContainer,options){
    
        this.critical_point=critical_point;
        this.scrollContainer=scrollContainer;
        this.eventEl=eventEl;
        this.options=options;
        this.setState(INIT_STATE);
        this.bindEvent();
    }
    setState(state){
        this.state=state;
    }
    bindEvent(){
        const change=this.options.change;
        const reset=this.options.reset;
        // 添加响应事件
        this.eventEl.addEventListener('scroll',()=>{
            if(this.needChange()) {
                // 当needChange方法为真时，执行options属性中的change方法
                change();
                this.setState(CHANGED_STATE);
            } else if(this.needReset()) {
                // 当needReset方法为真时，执行options属性中的reset方法
                reset();
                this.setState(INIT_STATE);
            }
        },true)
    }
    needChange(){
        return this.state!==CHANGED_STATE&&this.scrollContainer.scrollTop>this.critical_point;
    }

    needReset(){
        return this.state!==INIT_STATE&&this.scrollContainer.scrollTop<=this.critical_point;
    }
}
// 导出Scroll类
export default Scroll;